﻿<Window x:Class="MapTileStore.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:map="clr-namespace:MapControl;assembly=MapControl"
        Title="MainWindow" Height="557" Width="798" Loaded="Window_Loaded" xmlns:my="clr-namespace:MapTileStore">
    <Window.Resources>
        <map:TileLayerCollection x:Key="TileLayers">
            <map:TileLayer SourceName="OpenStreetMap" Description="© {y} OpenStreetMap Contributors, CC-BY-SA"
                           TileSource="http://{c}.tile.openstreetmap.org/{z}/{x}/{y}.png"/>
            <map:TileLayer SourceName="OpenCycleMap" Description="OpenCycleMap - © {y} Andy Allen &amp; OpenStreetMap Contributors, CC-BY-SA"
                           TileSource="http://{c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png"/>
            <map:TileLayer SourceName="OCM Transport" Description="OpenCycleMap Transport - © {y} Andy Allen &amp; OpenStreetMap Contributors, CC-BY-SA"
                           TileSource="http://{c}.tile2.opencyclemap.org/transport/{z}/{x}/{y}.png"/>
            <map:TileLayer SourceName="OCM Landscape" Description="OpenCycleMap Landscape - © {y} Andy Allen &amp; OpenStreetMap Contributors, CC-BY-SA"
                           TileSource="http://{c}.tile3.opencyclemap.org/landscape/{z}/{x}/{y}.png"/>
            <map:TileLayer SourceName="MapQuest OSM" Description="MapQuest OSM - © {y} MapQuest &amp; OpenStreetMap Contributors"
                           TileSource="http://otile{n}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png"/>

            <!-- Note: The providers of the below TileLayers do not allow access to their
                 map content without using their APIs (i.e. Google Maps API or Bing Maps API).
                 Hence the declarations below are for demonstration purpose only. -->

            <!--<map:TileLayer SourceName="Google Maps" Description="Google Maps - © {y} Google"
                           TileSource="http://mt{i}.google.com/vt/x={x}&amp;y={y}&amp;z={z}" MaxZoomLevel="20"/>
            <map:TileLayer SourceName="Google Images" Description="Google Maps - © {y} Google"
                           TileSource="http://khm{i}.google.com/kh/v=119&amp;x={x}&amp;y={y}&amp;z={z}" MaxZoomLevel="20" HasDarkBackground="True"/>
            <map:TileLayer SourceName="Bing Maps" Description="Bing Maps - © {y} Microsoft Corporation"
                           TileSource="http://ecn.t{i}.tiles.virtualearth.net/tiles/r{q}.png?g=0&amp;stl=h" MaxZoomLevel="20"/>
            <map:TileLayer SourceName="Bing Images" Description="Bing Maps - © {y} Microsoft Corporation"
                           TileSource="http://ecn.t{i}.tiles.virtualearth.net/tiles/a{q}.jpeg?g=0" MaxZoomLevel="20" HasDarkBackground="True"/>
            <map:TileLayer SourceName="Bing Hybrid" Description="Bing Maps - © {y} Microsoft Corporation"
                           TileSource="http://ecn.t{i}.tiles.virtualearth.net/tiles/h{q}.jpeg?g=0&amp;stl=h" MaxZoomLevel="20" HasDarkBackground="True"/>-->

            <!-- The TileLayer below uses an ImageTileSource, which bypasses caching of map tile images -->

            <!--<map:TileLayer SourceName="OSM Uncached" Description="© {y} OpenStreetMap Contributors, CC-BY-SA">
                <map:TileLayer.TileSource>
                    <map:ImageTileSource UriFormat="http://{c}.tile.openstreetmap.org/{z}/{x}/{y}.png"/>
                </map:TileLayer.TileSource>
            </map:TileLayer>-->
        </map:TileLayerCollection>
        <CollectionViewSource x:Key="TileLayersView" Source="{StaticResource TileLayers}"/>
        <map:TileLayer x:Key="SeamarksTileLayer" SourceName="Seamarks" Description="© {y} OpenSeaMap Contributors, CC-BY-SA"
                       TileSource="http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png" MinZoomLevel="10" MaxZoomLevel="18"/>
        <!--<local:SampleItemCollection x:Key="Polylines"/>
        <local:SampleItemCollection x:Key="Points"/>
        <local:SampleItemCollection x:Key="Pushpins"/>-->
        <my:ViewportPositionToVisibilityConverter x:Key="ViewportPositionToVisibilityConverter"/>
        <DataTemplate x:Key="PolylineItemTemplate">
            <map:MapPolyline Locations="{Binding Locations}" Stroke="Red" StrokeThickness="3"/>
        </DataTemplate>
        <Style x:Key="PointItemStyle" TargetType="map:MapItem">
            <Setter Property="map:MapPanel.Location" Value="{Binding Location}"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="map:MapItem">
                        <Canvas>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="Disabled"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="labelBackground" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.1"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="SelectionStates">
                                    <VisualState x:Name="Unselected"/>
                                    <VisualState x:Name="Selected"/>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="CurrentStates">
                                    <VisualState x:Name="NotCurrent"/>
                                    <VisualState x:Name="Current">
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="path" Storyboard.TargetProperty="Stroke.Color" To="Magenta" Duration="0:0:0.1"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Path Name="path" StrokeThickness="2" Fill="Transparent">
                                <Path.Stroke>
                                    <SolidColorBrush Color="Gray"/>
                                </Path.Stroke>
                                <Path.Data>
                                    <EllipseGeometry RadiusX="8" RadiusY="8"/>
                                </Path.Data>
                            </Path>
                            <Grid Canvas.Left="10" Canvas.Bottom="3">
                                <Rectangle Name="labelBackground" Fill="White" Opacity="0.7"/>
                                <TextBlock Margin="2,0,2,1" Text="{Binding Name}"/>
                            </Grid>
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="PushpinItemStyle" TargetType="map:MapItem">
            <Setter Property="map:MapPanel.Location" Value="{Binding Location}"/>
            <Setter Property="Visibility">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource ViewportPositionToVisibilityConverter}">
                        <Binding Path="(map:MapPanel.ParentMap)" RelativeSource="{RelativeSource Self}"/>
                        <Binding Path="(map:MapPanel.ViewportPosition)" RelativeSource="{RelativeSource Self}"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <map:Pushpin Content="{Binding Name}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="OrangeRed"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="250" />
            <ColumnDefinition Width="237*" />
        </Grid.ColumnDefinitions>
        <Grid Name="formGrid">
            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition Height="30" />
                <RowDefinition Height="30" />
                <RowDefinition Height="30" />
                <RowDefinition Height="30" />
                <RowDefinition Height="181*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100" />
                <ColumnDefinition Width="150" />
            </Grid.ColumnDefinitions>
            <TextBlock Margin="5,0,0,0" Text="north,west:" VerticalAlignment="Center"/>
            <TextBlock Margin="5,0,0,0" Grid.Row="1" Text="south,east:" VerticalAlignment="Center"/>
            <TextBlock Margin="5,0,0,0" Grid.Row="2" Text="Zoom:" VerticalAlignment="Center"/>
            <TextBlock Margin="5,0,0,0" Grid.Row="3" Text="Provider:" VerticalAlignment="Center"/>
            <TextBox Name="textBoxLng" Text="{Binding Path=Longitude, Mode=TwoWay}" Grid.Row="0" Margin="3" Grid.Column="1"/>
            <TextBox Name="textBoxLat" Text="{Binding Path=Latitude, Mode=TwoWay}" Grid.Row="1" Margin="3" Grid.Column="1"/>
            <TextBox Name="textBoxZoom" Text="{Binding Path=ZoomLevel, Mode=TwoWay}" Grid.Row="2" Margin="3" Grid.Column="1"/>
            <ComboBox Name="comboBoxProvider" DisplayMemberPath="SourceName" SelectedValuePath="Id" Grid.Row="3" Margin="3" Grid.Column="1" SelectedIndex="0"/>
            <Button Name="buttonSaveLocation" VerticalAlignment="Top" Margin="0,10,0,20" Grid.Row="5" Grid.Column="1" Content="Download" Height="28" Width="90"/>
        </Grid>
        <Border Grid.Column="1" Margin="5">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <map:Map Name="map" IsManipulationEnabled="True" Margin="2" FontSize="10"
                 LightForeground="Black" LightBackground="White" DarkForeground="White" DarkBackground="#FF3F3F3F"
                 Center="53.5,8.2" ZoomLevel="11"
                 BaseTileLayer="{Binding Source={StaticResource TileLayersView}, Path=CurrentItem}"
                 ManipulationInertiaStarting="MapManipulationInertiaStarting"
                 MouseMove="MapMouseMove" MouseLeave="MapMouseLeave">
                    <map:Map.ContextMenu>
                        <ContextMenu Name="MapContextMenu">
                            <MenuItem Header="Copy Location" Click="copyLocationToClipboard_Click" />
                        </ContextMenu>
                    </map:Map.ContextMenu>
                    <map:MapGraticule Opacity="0.6"/>
                    <map:MapScale Margin="4" Opacity="0.8"/>
                    <map:Pushpin Location="53.5,8.2" Background="Yellow" Foreground="Blue" Content="N 53° 30' E 8° 12'">
                        <map:Pushpin.Visibility>
                            <MultiBinding Converter="{StaticResource ViewportPositionToVisibilityConverter}">
                                <Binding Path="(map:MapPanel.ParentMap)" RelativeSource="{RelativeSource Self}"/>
                                <Binding Path="(map:MapPanel.ViewportPosition)" RelativeSource="{RelativeSource Self}"/>
                            </MultiBinding>
                        </map:Pushpin.Visibility>
                    </map:Pushpin>
                    <TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="4" FontSize="10"
                       Text="{Binding BaseTileLayer.Description, ElementName=map}"/>
                </map:Map>
                <Grid Grid.Row="1" Margin="2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Name="mouseLocation" Margin="4" VerticalAlignment="Center"/>
                    <StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
                        <Slider Name="zoomSlider" ToolTip="Zoom Level" Margin="4,0,4,0" Width="100" Minimum="1" Maximum="20" SmallChange="0.01"
                        Value="{Binding TargetZoomLevel, ElementName=map}" />
                        <Slider Name="headingSlider" ToolTip="Heading" Margin="4,0,4,0" Width="100" Minimum="0" Maximum="360" SmallChange="10" LargeChange="45"
                        Value="{Binding TargetHeading, ElementName=map}"/>
                        <CheckBox ToolTip="Map Overlay" Margin="4,0,4,0" VerticalAlignment="Center" Content="Seamarks" Click="SeamarksClick"/>
                        <ComboBox ToolTip="Main Tile Layer" Margin="4,0,0,0" DisplayMemberPath="SourceName"
                          ItemsSource="{Binding Source={StaticResource TileLayersView}}"/>
                    </StackPanel>
                </Grid>
            </Grid>
        </Border>
    </Grid>
</Window>
